home *** CD-ROM | disk | FTP | other *** search
- /*
- File: LinkB.cpp
-
- Contains: Implementation of ODBaseLink class
-
- Owned by: Craig Carper
-
- Copyright: © 1993 - 1996 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <2> 5/24/96 jpa 1246074: SOM_CATCH --> SOM_TRY..SOM_ENDTRY
-
- To Do:
- In Progress:
-
- */
-
- #define VARIABLE_MACROS
-
- #define ODBaseLink_Class_Source
- #include <LinkB.xih>
-
- #ifndef _EXCEPT_
- #include <Except.h>
- #endif
-
- #ifndef _ODMEMORY_
- #include <ODMemory.h>
- #endif
-
- #ifndef _CONSTDEF_
- #include <ConstDef.h>
- #endif
-
- #ifndef _LINKDLGS_
- #include <LinkDlgs.h>
- #endif
-
- #ifndef SOM_ODLinkSource_xh
- #include <LinkSrc.xh>
- #endif
-
- #ifndef _LINKLIST_
- #include <LinkList.h>
- #endif
-
- #ifndef SOM_ODPart_xh
- #include <Part.xh>
- #endif
-
- #ifndef SOM_ODFrame_xh
- #include <Frame.xh>
- #endif
-
- #ifndef SOM_ODSession_xh
- #include <ODSessn.xh>
- #endif
-
- #ifndef SOM_ODArbitrator_xh
- #include <Arbitrat.xh>
- #endif
-
- #ifndef SOM_ODWindowState_xh
- #include <WinStat.xh>
- #endif
-
- #ifndef SOM_Module_OpenDoc_Foci_defined
- #include <Foci.xh>
- #endif
-
- #ifndef SOM_ODContainer_xh
- #include <ODCtr.xh>
- #endif
-
- #ifndef SOM_ODDocument_xh
- #include <Document.xh>
- #endif
-
- #ifndef SOM_ODDraft_xh
- #include <Draft.xh>
- #endif
-
- #ifndef SOM_ODStorageUnit_xh
- #include <StorageU.xh>
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdProps_defined
- #include <StdProps.xh>
- #endif
-
- #ifndef SOM_Module_OpenDoc_StdTypes_defined
- #include <StdTypes.xh>
- #endif
-
- #ifndef __ERRORS__
- #include <Errors.h>
- #endif
-
- #ifndef _ODUTILS_
- #include <ODUtils.h>
- #endif
-
- #ifndef _STDTYPIO_
- #include <StdTypIO.h>
- #endif
-
- #ifndef _DOCUTILS_
- #include <DocUtils.h>
- #endif
-
- #ifndef _STORUTIL_
- #include <StorUtil.h>
- #endif
-
- #ifndef _ODDEBUG_
- #include <ODDebug.h>
- #endif
-
- #ifndef _TEMPOBJ_
- #include "TempObj.h"
- #endif
-
- #pragma segment ODBaseLink
-
- //==============================================================================
- // Local Classes
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // Class ODPartLink
- //------------------------------------------------------------------------------
-
- class ODPartLink : public Link {
- public:
- ODPartLink(ODPart* thePart) {fPart = thePart;}
- virtual ~ODPartLink() {}
- ODPart* GetPart() { return fPart;}
-
- private:
- ODPart* fPart;
- };
-
- //------------------------------------------------------------------------------
- // Class ODPartList
- //------------------------------------------------------------------------------
-
- class ODPartList
- {
- friend class ODPartListIterator;
-
- public:
-
- ODPartList() {}
- virtual ~ODPartList() {this->RemoveAllParts(somGetGlobalEnvironment());}
-
- virtual ODBoolean ContainsPart(Environment *ev, ODPart* thePart);
- virtual ODBoolean AddPart(Environment *ev, ODPart* thePart);
- virtual void AddPartList(Environment *ev, ODPartList* thePartList);
- virtual void RemovePart(Environment *ev, ODPart* thePart);
- virtual void RemovePartList(Environment *ev, ODPartList* thePartList);
- virtual void RemoveAllParts(Environment *ev);
-
- private:
-
- LinkedList fImplementation;
- };
-
- //------------------------------------------------------------------------------
- // Class ODPartListIterator
- //------------------------------------------------------------------------------
-
- class ODPartListIterator
- {
- public:
-
- ODPartListIterator(ODPartList* partList)
- : fIterator(&(partList->fImplementation))
- {}
- ODVMethod ~ODPartListIterator()
- {}
-
- ODMethod ODPart* First();
- ODMethod ODPart* Next();
- ODMethod ODBoolean IsNotComplete();
-
- private:
-
- LinkedListIterator fIterator;
-
- };
-
- //------------------------------------------------------------------------------
- // ODPartList::ContainsPart
- //------------------------------------------------------------------------------
-
- ODBoolean ODPartList::ContainsPart(Environment *ev, ODPart* thePart)
- {
- ODBoolean result = kODFalse;
- ODPartListIterator iter(this);
-
- for (ODPart* part = iter.First(); (result == kODFalse) && iter.IsNotComplete(); part = iter.Next())
- {
- result = ODObjectsAreEqual(ev, part, thePart);
- }
-
- return result;
- }
-
- //------------------------------------------------------------------------------
- // ODPartList::AddPart
- //------------------------------------------------------------------------------
-
- ODBoolean ODPartList::AddPart(Environment *ev, ODPart* thePart)
- {
- ODBoolean notPresent = !this->ContainsPart(ev, thePart);
- if ( notPresent )
- {
- ODPartLink* aLink = new ODPartLink(thePart);
- thePart->Acquire(ev);
- fImplementation.AddLast(aLink);
- }
-
- return notPresent;
- }
-
- //------------------------------------------------------------------------------
- // ODPartList::AddPartList
- //------------------------------------------------------------------------------
-
- void ODPartList::AddPartList(Environment *ev, ODPartList* thePartList)
- {
- if ( thePartList )
- {
- ODPartListIterator iter(thePartList);
-
- for (ODPart* thePart = iter.First(); iter.IsNotComplete(); thePart = iter.Next())
- {
- this->AddPart(ev, thePart);
- }
- }
- }
-
- //------------------------------------------------------------------------------
- // ODPartList::RemovePart
- //------------------------------------------------------------------------------
-
- void ODPartList::RemovePart(Environment *ev, ODPart* thePart)
- {
- LinkedListIterator iter(&fImplementation);
-
- ODPartLink* aLink = (ODPartLink*)iter.First();
- while (aLink != NULL)
- {
- ODPart* part = aLink->GetPart();
- if ( ODObjectsAreEqual(ev, part, thePart) )
- {
- fImplementation.Remove(*aLink);
- aLink = NULL;
- part->Release(ev);
- }
- else
- aLink = (ODPartLink*)iter.Next();
- }
- }
-
- //------------------------------------------------------------------------------
- // ODPartList::RemovePartList
- //------------------------------------------------------------------------------
-
- void ODPartList::RemovePartList(Environment *ev, ODPartList* thePartList)
- {
- if ( thePartList )
- {
- ODPartListIterator iter(thePartList);
-
- for (ODPart* thePart = iter.First(); iter.IsNotComplete(); thePart = iter.Next())
- {
- this->RemovePart(ev, thePart);
- }
- }
- }
-
- //------------------------------------------------------------------------------
- // ODPartList::RemoveAllParts
- //------------------------------------------------------------------------------
-
- void ODPartList::RemoveAllParts(Environment *ev)
- {
- ODPartLink* aLink = (ODPartLink*) fImplementation.RemoveFirst();
- while (aLink != kODNULL)
- {
- ODPart* part = aLink->GetPart();
- part->Release(ev);
- delete aLink;
- aLink = (ODPartLink*) fImplementation.RemoveFirst();
- }
- }
-
- //------------------------------------------------------------------------------
- // ODPartListIterator::First
- //------------------------------------------------------------------------------
-
- ODPart* ODPartListIterator::First()
- {
- ODPart* part = kODNULL;
- ODPartLink* partLink = (ODPartLink*) fIterator.First();
-
- if ( partLink )
- part = partLink->GetPart();
-
- return part;
- }
-
- //------------------------------------------------------------------------------
- // ODPartListIterator::Next
- //------------------------------------------------------------------------------
-
- ODPart* ODPartListIterator::Next()
- {
- ODPart* part = kODNULL;
- ODPartLink* partLink = (ODPartLink*) fIterator.Next();
-
- if ( partLink )
- part = partLink->GetPart();
-
- return part;
- }
-
- //------------------------------------------------------------------------------
- // ODPartListIterator::IsNotComplete
- //------------------------------------------------------------------------------
-
- ODBoolean ODPartListIterator::IsNotComplete()
- {
- return fIterator.IsNotComplete();
- }
-
- //==============================================================================
- // ODBaseLink
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // ODBaseLink: somUninit
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinksomUninit(ODBaseLink *somSelf)
- {
- /* ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf); */
- ODBaseLinkMethodDebug("ODBaseLink","somUninit");
-
- parent_somUninit(somSelf);
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: InitBaseLink
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkInitBaseLink(ODBaseLink *somSelf, Environment *ev,
- ODStorageUnit* storageUnit)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","InitBaseLink");
-
- SOM_TRY
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fPartList = (ODPartList*) kODNULL;
- _fLinkSource = (ODLinkSource*) kODNULL;
- _fDirty = kODFalse;
- _fIterationInProgress = kODFalse;
- _fRestartIteration = kODFalse;
- */
- somSelf->InitPersistentObject(ev, storageUnit);
-
- _fPartList = new ODPartList();
-
- ODStorageUnit* su = somSelf->GetStorageUnit(ev);
- ODSUAddPropValue(ev, su, kODPropLinkSource, kODWeakStorageUnitRef);
-
- somSelf->SetBaseLinkDirty(ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: InitBaseLinkFromStorage
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkInitBaseLinkFromStorage(ODBaseLink *somSelf, Environment *ev,
- ODStorageUnit* storageUnit)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","InitBaseLinkFromStorage");
-
- SOM_TRY
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fPartList = (ODPartList*) kODNULL;
- _fLinkSource = (ODLinkSource*) kODNULL;
- _fDirty = kODFalse;
- _fIterationInProgress = kODFalse;
- _fRestartIteration = kODFalse;
- */
- somSelf->InitPersistentObjectFromStorage(ev, storageUnit);
-
- _fPartList = new ODPartList();
-
- if ( storageUnit->Exists(ev, kODPropLinkSource, 0, 0) )
- {
- ODID linkSourceID = ODGetWeakSURefProp(ev, storageUnit, kODPropLinkSource, kODWeakStorageUnitRef);
- if ( linkSourceID == kODNULLID )
- somSelf->SetBaseLinkDirty(ev);
- else
- _fLinkSource = storageUnit->GetDraft(ev)->AcquireLinkSource(ev, linkSourceID);
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: Externalize (OVERRIDE)
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkExternalize(ODBaseLink *somSelf, Environment *ev)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","Externalize");
-
- SOM_TRY
-
- parent_Externalize(somSelf,ev);
-
- if ( _fDirty )
- {
- ODStorageUnit* su = somSelf->GetStorageUnit(ev);
-
- if ( _fLinkSource == (ODLinkSource*) kODNULL )
- ODSURemoveProperty(ev, su, kODPropLinkSource);
- else
- ODSetWeakSURefProp(ev, su, kODPropLinkSource, kODWeakStorageUnitRef, _fLinkSource->GetID(ev));
-
- _fDirty = kODFalse;
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: CloneInto (OVERRIDE)
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkCloneInto(ODBaseLink *somSelf, Environment *ev,
- ODDraftKey key,
- ODStorageUnit* toSU,
- ODFrame* scopeFrame)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","CloneInto");
-
- SOM_TRY
-
- // If one of our properties already exists, this object has been cloned already
- if ( toSU->Exists(ev, kODPropLinkSource, kODWeakStorageUnitRef, 0) )
- return;
-
- parent_CloneInto(somSelf, ev, key, toSU, scopeFrame);
-
- if ( _fLinkSource != (ODLinkSource*) kODNULL )
- {
- ODDraft* draft = somSelf->GetStorageUnit(ev)->GetDraft(ev);
- ODID clonedLinkSourceID = draft->WeakClone(ev, key, _fLinkSource->GetID(ev), 0,
- (scopeFrame ? scopeFrame->GetID(ev) : 0));
-
- ODSetWeakSURefProp(ev, toSU, kODPropLinkSource, kODWeakStorageUnitRef, clonedLinkSourceID);
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: ReleaseAll (OVERRIDE)
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkReleaseAll(ODBaseLink *somSelf, Environment *ev)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","ReleaseAll");
-
- SOM_TRY
-
- parent_ReleaseAll(somSelf,ev);
-
- ODReleaseObject(ev, _fLinkSource);
-
- // Release all part references stored in the list of registered parts
- ODDeleteObject(_fPartList);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: SetBaseLinkDirty
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkSetBaseLinkDirty(ODBaseLink *somSelf, Environment *ev)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","SetBaseLinkDirty");
-
- SOM_TRY
- _fDirty = kODTrue;
-
- ODDraft* draft = somSelf->GetStorageUnit(ev)->GetDraft(ev);
- if ( draft->GetPermissions(ev) != kODDPReadOnly )
- draft->SetChangedFromPrev(ev);
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink::ShowLinkDestinationInfo
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK ODBaseLinkShowLinkDestinationInfo(ODBaseLink *somSelf, Environment *ev,
- ODFacet* facet,
- ODLinkInfo* info,
- ODBoolean changesAllowed,
- ODLinkInfoResult* infoResult)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","ShowLinkDestinationInfo");
-
- ODBoolean result = kODFalse;
-
- SOM_TRY
-
- THROW_IF_NULL(facet, kODErrNullFacetInput);
- THROW_IF_NULL(info, kODErrNullLinkInfoInput);
- THROW_IF_NULL(infoResult, kODErrNullLinkInfoResultInput);
- THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
-
- ODSession* session = somSelf->GetStorageUnit(ev)->GetSession(ev);
- ODTypeToken modalFocus = session->Tokenize(ev, kODModalFocus);
- ODArbitrator* arbitrator = session->GetArbitrator(ev);
- TempODFrame currentOwner = arbitrator->AcquireFocusOwner(ev, modalFocus);
-
- if ( arbitrator->RequestFocus(ev, modalFocus, facet->GetFrame(ev)) )
- {
- infoResult->autoUpdate = info->autoUpdate;
-
- session->GetWindowState(ev)->DeactivateFrontWindows(ev);
-
- result = ShowLinkDestinationInfo(somSelf, info, changesAllowed, infoResult);
-
- session->GetWindowState(ev)->ActivateFrontWindows(ev);
-
- arbitrator->TransferFocus(ev, modalFocus, facet->GetFrame(ev), currentOwner);
- }
- else
- {
- SysBeep(2);
- }
- return result;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODFalse;
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: Lock
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBoolean SOMLINK ODBaseLinkLock(ODBaseLink *somSelf, Environment *ev,
- ODULong wait,
- ODLinkKey* key)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","Lock");
-
- SOM_TRY
-
- THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
-
- return _fLinkSource->Lock(ev, wait, key);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODFalse;
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: Unlock
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkUnlock(ODBaseLink *somSelf, Environment *ev,
- ODLinkKey key)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","Unlock");
-
- SOM_TRY
-
- THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
-
- _fLinkSource->Unlock(ev, key);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: KeyValid
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkKeyValid(ODBaseLink *somSelf, Environment *ev,
- ODLinkKey key)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","KeyValid");
-
- SOM_TRY
-
- THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
-
- _fLinkSource->KeyValid(ev, key);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: GetContentStorageUnit
- //------------------------------------------------------------------------------
-
- SOM_Scope ODStorageUnit* SOMLINK ODBaseLinkGetContentStorageUnit(ODBaseLink *somSelf, Environment *ev,
- ODLinkKey key)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","GetContentStorageUnit");
-
- SOM_TRY
-
- THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
-
- if ( _fLinkSource->GetStatus(ev) == kODErrCannotEstablishLink )
- THROW(kODErrCannotEstablishLink);
-
- ODStorageUnit* su = _fLinkSource->GetContentStorageUnit(ev, key);
-
- if ( su && !su->Exists(ev, kODPropContents, kODNULL, 1) )
- THROW(kODErrNoLinkContent);
-
- return su;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return (ODStorageUnit*) kODNULL;
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: RegisterDependent
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkRegisterDependent(ODBaseLink *somSelf, Environment *ev,
- ODPart* clientPart,
- ODUpdateID id)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","RegisterDependent");
-
- // This method does nothing if clientPart is already registered or
- // if draft is read-only.
-
- SOM_TRY
-
- THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
-
- THROW_IF_NULL(_fPartList, kODErrCannotRegisterDependent);
-
- ODDraftPermissions permissions = somSelf->GetStorageUnit(ev)->GetDraft(ev)->GetPermissions(ev);
-
- if (HAS_WRITE_ACCESS(permissions))
- {
- if ( _fPartList->AddPart(ev, clientPart) )
- {
- ODUpdateID currentID = somSelf->GetUpdateID(ev);
- if ( (currentID != kODUnknownUpdate) && (id != currentID) )
- clientPart->LinkUpdated(ev, (ODLink*) somSelf, currentID);
- }
- }
-
- SOM_CATCH_ALL
-
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: UnregisterDependent
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkUnregisterDependent(ODBaseLink *somSelf, Environment *ev,
- ODPart* clientPart)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","UnregisterDependent");
-
- SOM_TRY
-
- // If fPartList is null, this object's ReleaseAll() has been called
- // and already unregistered any dependents.
- if ( _fPartList )
- _fPartList->RemovePart(ev, clientPart);
-
- SOM_CATCH_ALL
-
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: GetUpdateID
- //------------------------------------------------------------------------------
-
- SOM_Scope ODUpdateID SOMLINK ODBaseLinkGetUpdateID(ODBaseLink *somSelf, Environment *ev)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","GetUpdateID");
-
- SOM_TRY
-
- if ( _fLinkSource == (ODLinkSource*) kODNULL )
- THROW(kODErrBrokenLink);
-
- return _fLinkSource->GetUpdateID(ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return kODUnknownUpdate;
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: GetChangeTime
- //------------------------------------------------------------------------------
-
- SOM_Scope ODTime SOMLINK ODBaseLinkGetChangeTime(ODBaseLink *somSelf, Environment *ev)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","GetChangeTime");
-
- SOM_TRY
-
- if ( _fLinkSource == (ODLinkSource*) kODNULL )
- THROW(kODErrBrokenLink);
-
- return _fLinkSource->GetChangeTime(ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return (ODTime)0;
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: SetLinkSource
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkSetLinkSource(ODBaseLink *somSelf, Environment *ev,
- ODLinkSource* linkSource)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","SetLinkSource");
-
- SOM_TRY
-
- if ( !ODObjectsAreEqual(ev, _fLinkSource, linkSource) )
- {
- ODReleaseObject(ev, _fLinkSource);
-
- _fLinkSource = linkSource;
- if ( _fLinkSource != (ODLinkSource*) kODNULL )
- _fLinkSource->Acquire(ev);
-
- somSelf->SetBaseLinkDirty(ev);
- }
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: GetLinkSource
- //------------------------------------------------------------------------------
-
- SOM_Scope ODLinkSource* SOMLINK ODBaseLinkGetLinkSource(ODBaseLink *somSelf, Environment *ev)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","GetLinkSource");
-
- if ( _fLinkSource == (ODLinkSource*) kODNULL )
- {
- ODSetSOMException(ev, kODErrBrokenLink);
- return (ODLinkSource*) kODNULL;
- }
-
- return _fLinkSource;
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: ShowSourceContent
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkShowSourceContent(ODBaseLink *somSelf, Environment *ev)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","ShowSourceContent");
-
- SOM_TRY
-
- THROW_IF_NULL(_fLinkSource, kODErrBrokenLink);
-
- _fLinkSource->ShowSourceContent(ev);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODBaseLink: UpdateDependents
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODBaseLinkUpdateDependents(ODBaseLink *somSelf, Environment *ev)
- {
- ODBaseLinkData *somThis = ODBaseLinkGetData(somSelf);
- ODBaseLinkMethodDebug("ODBaseLink","UpdateDependents");
-
- if ( _fIterationInProgress )
- {
- _fRestartIteration = kODTrue;
- return;
- }
-
- _fIterationInProgress = kODTrue;
-
- SOM_TRY
-
- do
- {
- _fRestartIteration = kODFalse;
-
- ODPartList registeredParts;
- registeredParts.AddPartList(ev, _fPartList);
-
- ODPartListIterator iter(®isteredParts);
-
- for (ODPart* clientPart = iter.First();
- !_fRestartIteration && iter.IsNotComplete();
- clientPart = iter.Next())
- {
- // Don't call LinkUpdated if part has unregistered during iteration.
- if ( _fPartList->ContainsPart(ev, clientPart) )
- {
- // Ignore any errors returned from a part's LinkUpdated method
- TRY
- clientPart->LinkUpdated(ev, (ODLink*) somSelf, somSelf->GetUpdateID(ev));
- CATCH_ALL
- ENDTRY
- }
- }
-
- } while ( _fRestartIteration );
-
- SOM_CATCH_ALL
-
- SOM_ENDTRY
-
- _fIterationInProgress = kODFalse;
- }
-